package cn.iocoder.yudao.module.lowcode.service.datasource;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.lowcode.controller.admin.datasource.vo.*;
import cn.iocoder.yudao.module.lowcode.dal.dataobject.datasource.LowcodeDataSourceConfigDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 低代码数据源配置 Service 接口
 *
 * @author 芋道源码
 */
public interface LowcodeDataSourceConfigService {

    /**
     * 创建数据源配置
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createDataSourceConfig(@Valid LowcodeDataSourceConfigSaveReqVO createReqVO);

    /**
     * 更新数据源配置
     *
     * @param updateReqVO 更新信息
     */
    void updateDataSourceConfig(@Valid LowcodeDataSourceConfigSaveReqVO updateReqVO);

    /**
     * 删除数据源配置
     *
     * @param id 编号
     */
    void deleteDataSourceConfig(Long id);

    /**
     * 获得数据源配置
     *
     * @param id 编号
     * @return 数据源配置
     */
    LowcodeDataSourceConfigDO getDataSourceConfig(Long id);

    /**
     * 获得数据源配置分页
     *
     * @param pageReqVO 分页查询
     * @return 数据源配置分页
     */
    PageResult<LowcodeDataSourceConfigDO> getDataSourceConfigPage(LowcodeDataSourceConfigPageReqVO pageReqVO);

    /**
     * 获得启用的数据源配置列表
     *
     * @return 数据源配置列表
     */
    List<LowcodeDataSourceConfigDO> getEnabledDataSourceConfigList();

    /**
     * 根据名称获取数据源配置
     *
     * @param name 数据源名称
     * @return 数据源配置
     */
    LowcodeDataSourceConfigDO getDataSourceConfigByName(String name);

    /**
     * 测试数据源连接
     *
     * @param testReqVO 测试参数
     * @return 测试结果
     */
    LowcodeDataSourceTestRespVO testConnection(LowcodeDataSourceTestReqVO testReqVO);

    /**
     * 获取数据源的表列表
     *
     * @param id 数据源配置ID
     * @param tableName 表名模糊匹配（可选）
     * @return 表名列表
     */
    List<String> getTableList(Long id, String tableName);

    /**
     * 获取数据源的表信息列表（包含注释）
     *
     * @param id 数据源配置ID
     * @param tableName 表名模糊匹配（可选）
     * @return 表信息列表
     */
    List<LowcodeTableInfoRespVO> getTableInfoList(Long id, String tableName);

    /**
     * 获取表的字段信息
     *
     * @param id 数据源配置ID
     * @param tableName 表名
     * @return 字段信息列表
     */
    List<TableColumnInfo> getTableColumnList(Long id, String tableName);

    /**
     * 初始化默认数据源配置
     * 确保系统有可用的默认数据源
     */
    void initDefaultDataSourceConfig();

    /**
     * 获取支持的数据库类型列表
     *
     * @return 支持的数据库类型列表
     */
    List<String> getSupportedDatabaseTypes();

    /**
     * 表字段信息
     */
    class TableColumnInfo {
        private String columnName;
        private String dataType;
        private Boolean nullable;
        private String columnComment;
        private Boolean primaryKey;

        // getter/setter
        public String getColumnName() { return columnName; }
        public void setColumnName(String columnName) { this.columnName = columnName; }
        public String getDataType() { return dataType; }
        public void setDataType(String dataType) { this.dataType = dataType; }
        public Boolean getNullable() { return nullable; }
        public void setNullable(Boolean nullable) { this.nullable = nullable; }
        public String getColumnComment() { return columnComment; }
        public void setColumnComment(String columnComment) { this.columnComment = columnComment; }
        public Boolean getPrimaryKey() { return primaryKey; }
        public void setPrimaryKey(Boolean primaryKey) { this.primaryKey = primaryKey; }
    }

}